// Package db
// @Title db[简述该包的主要作用]
// @Description
// @Author  cnHuaShao
// @since v0.0.1
// @Version v1.0.0
// @Date 2024/4/21 21:59
// @Update 2024/4/21 21:59
package db

import (
	"FinancialManagement/src/base/baselog"
	"FinancialManagement/src/base/config"
	"fmt"
	"gorm.io/gorm"
	"gorm.io/gorm/schema"
	"time"
)

var DbRepos map[string]*gorm.DB

type dbRepo struct {
	DbTypeId   int
	DbTypeName string
	DbJDBC     string
	DbRepo     *gorm.DB
}

// DBConnect
// @Description: 公共建立数据库连接方法
// @param dataSource
// @return *gorm.DB
// @return error
func DBConnect(dia gorm.Dialector) (*gorm.DB, error) {
	baselog.Logger.Debug("------建立数据库连接-------")

	db, err := gorm.Open(dia, &gorm.Config{
		NamingStrategy: schema.NamingStrategy{
			SingularTable: true,
		},
		// Logger: logger.Default.LogMode(logger.Info), // 日志配置
	})

	if err != nil {
		return nil, fmt.Errorf("[db connection failed] : %s", err.Error())
	}

	db.Set("gorm:table_options", "CHARSET=utf8mb4")

	cfg := config.Get().MySQL.Base

	sqlDB, err := db.DB()
	if err != nil {
		return nil, err
	}

	// 设置连接池 用于设置最大打开的连接数，默认值为0表示不限制.设置最大的连接数，可以避免并发太高导致连接mysql出现too many connections的错误。
	sqlDB.SetMaxOpenConns(cfg.MaxOpenConn)

	// 设置最大连接数 用于设置闲置的连接数.设置闲置的连接数则当开启的一个连接使用完成后可以放在池里等候下一次使用。
	sqlDB.SetMaxIdleConns(cfg.MaxIdleConn)

	// 设置最大连接超时
	sqlDB.SetConnMaxLifetime(time.Minute * cfg.ConnMaxLifeTime)

	// 使用插件
	// db.Use(&TracePlugin{})

	return db, nil
}
